package com.smartstate.dataManagement.timedtask;


import cn.hutool.core.util.IdUtil;
import com.smartstate.dataManagement.entity.DeviceCarePlanEntity;
import com.smartstate.dataManagement.eunm.CommonEunm;
import com.smartstate.dataManagement.mapper.DeviceCarePlanMapper;
import com.smartstate.dataManagement.service.impl.DeviceCarePlanServiceImpl;
import com.smartstate.dataManagement.util.DateTimeUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 *  关于设备保养时间到期， 会依据保养周期天数；
 *  生成新的 设备保养计划 数据
 *  保养日期是：2022-5-28  保养周期是 5  ,下一次的保养计划是： 2022-6-2
 *  类似如此
 */
@Component
@Slf4j
public class DeviceCarePlanTask {

    @Autowired
    DeviceCarePlanMapper  deviceCarePlanMapper;

    @Autowired
    DeviceCarePlanServiceImpl  deviceCarePlanService;

    @Scheduled(cron = "0 30 3 * * ?")
    public void  deviceCarePlan(){
        log.info("设备保养数据更新开始");
        // 获取还没更新的数据（ isAdd为0+设备了保养周期的  数据  ）
        List<DeviceCarePlanEntity> list=deviceCarePlanMapper.getNoUpdate(CommonEunm.ZERO.getValue());
        for(DeviceCarePlanEntity dev:list) {
            // 获取当前时间
            LocalDate now = LocalDate.now();
            // 获取设备保养时间
            String currentTime = dev.getCareTime();
            LocalDate carTime = LocalDate.parse(currentTime.substring(0, 10));
            // 判断保养时间是否到期， 到期了就依据保养周期 新增一条新的设备保养数据,并将之前的设备保养计划数据的
            // isAdd  字段设置为1 ，说明已经新增。
            List<DeviceCarePlanEntity> newList = new ArrayList<>();
            List<String>  ids=new ArrayList<>();
            // 保养周期到期了才新增(即，保养时间未到的， 不需要处理， 保养时间到了， 才需要更新旧数据的isAdd=1 ， 然后依据周期新增一条数据
            int cz=carTime.compareTo(now);
            // 为了兼容 服务停止， 数据没有实时更新问题 ，
            if (cz <= 0 ) {
                // 差值转换
                String str=String.valueOf(cz);
                LocalDate  newCareTime=null;
                long temp = 0;
                if(str.contains("-")) {
                    temp = Long.parseLong(str.substring(str.indexOf("-")+1, str.length()));
                }
                // 差值转化
                if(temp <= Double.parseDouble(dev.getCareCycle())){
                    newCareTime=carTime.plusDays(Long.parseLong(dev.getCareCycle()));
                }
                if(temp>Double.parseDouble(dev.getCareCycle())){
                    double t = 0;
                    if(0==Integer.parseInt(dev.getCareCycle())){
                        newCareTime=carTime.plusDays(temp);
                    }
                    else {
                        t = temp / Double.parseDouble(dev.getCareCycle());
                        String st=String.valueOf(t);
                        int old =Integer.parseInt(st.substring(0,st.indexOf(".")));
                        if(st.length()>1) {
                            old = Integer.parseInt(st.substring(0, st.indexOf(".")));
                        }
                        // 非整除
                        String  y=String.valueOf(t);
                        y=y.substring(y.indexOf(".")+1,y.indexOf(".")+2);
                        if(String.valueOf(t).length()>=3  && !y.equals("0") ){
                            Integer newT=old+1;
                            newCareTime=carTime.plusDays(newT*Integer.parseInt(dev.getCareCycle()));
                        }
                        else{// 整除
                            newCareTime=carTime.plusDays(old*Integer.parseInt(dev.getCareCycle()));
                        }
                    }
                }
                //先组装好数据， 之后在批量新增
                DeviceCarePlanEntity dv = new DeviceCarePlanEntity.DeviceCarePlanBuilder().setCareCycle(dev.getCareCycle()).setId(dev.getId())
                        .setCareTime(newCareTime.toString())
                        .setIsAdd(CommonEunm.ZERO.getValue())
                        .setCreateTime(dev.getCreateTime())
                        .setUpdateTime(DateTimeUtil.localDateTime2String(LocalDateTime.now()))
                        .setDeviceId(dev.getDeviceId()).setDeviceName(dev.getDeviceName()).setCreateUser(CommonEunm.TIMER.getValue()).getBean();
                newList.add(dv);
                ids.add(String.valueOf(dev.getId()));
            }
            // 此处无法保证事务，所以转移事务
            if (newList.size() > 0) {
                boolean result = deviceCarePlanService.handleDevicePlan(newList,ids);
                log.info("设备保养更新" + result);
            }
        }

    }

}
